import org.kwis.msp.lcdui.*;
import org.kwis.msp.lwc.*;
import java.lang.Character;

public class ScreenManager extends Card implements Runnable, GameConstants
{
	private boolean first = true;
	private boolean bEndThread = false;	

	private int paddleLife;

	private int initPaddleX, initPaddleY;
	private int initBallX, initBallY;
	
	private boolean startGame;
	private int currStage;

	private Paddle paddle;
	private Ball ball;
	private Block block;

	Thread thread = null;

	public ScreenManager()
	{

		startGame = false;
		currStage = 1;

		// Paddle과 Ball의 초기 위치를 잡아준다.
		initPaddleX = getWidth()/2-PADDLE_WIDTH/2;
		initPaddleY = getHeight()-10-PADDLE_HEIGHT;
		initBallX = getWidth()/2-BALL_RADIUS;
		initBallY = getHeight()-2-16-BALL_RADIUS;

		initElements();
	}

	// Ball, Paddle, Block을 초기화시킨다.
	private void initElements()
	{
		paddle = new Paddle(initPaddleX, initPaddleY);
		ball = new Ball(initBallX, initBallY );
		ball.initialize();
		block = new Block(currStage);
		paddleLife = LIFE;
	}

	public void paint(Graphics g)
	{
		// 처음에 타이틀화면을 그려준다.
		if (first) {
			paintTitleScreen(g);
		}
		// 게임화면을 그러준다.
		else { 
			g.setColor(0xffffff);
			g.fillRect(0,0,getWidth(),getHeight());

			paddle.paint(g);
			ball.paint(g);
			block.paint(g);
		}
	}

	public void run()
	{
		while(!bEndThread)
		{
			// 공을 움직인후 충돌테스트를 해주고 repaint시켜준다.
			ball.move();
			hitTest();
			repaint();
			
			try
			{
				Thread.sleep(6);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	protected boolean keyNotify(int type, int key) 
	{
		// 처음 실행할때 타이틀을 보여준후 키가 눌렸을때의 처리
		if(first) {
			first = false;
			repaint();
			return true;
		}
		// 아무키나 입력을 받으면 시작하게 된다.
		else if(startGame == false && type == EventQueue.KEY_PRESSED)
		{
			startGame = true;
			thread = new Thread(this);
			thread.start();
		}
		// 왼쪽, 오른쪽 키에대한 이벤트 처리
		switch(Display.getGameAction(key)) 
		{
			case EventQueue.LEFT : 
				paddle.moveLeft();
				break;
			case EventQueue.RIGHT : 
				paddle.moveRight();
				break;
		}
		if(type == EventQueue.KEY_PRESSED) { repaint(); }
		return true;
	}

	// 처음의 타이틀 화면을 그려준다.
	public void paintTitleScreen(Graphics g)
	{
		Image img = null;

		try
		{
			img = Image.createImage("title.png");	
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		g.drawImage(img,0,0,Graphics.TOP);
	}

	private void hitTest()
	{
		wallHitTest();
	}

	// 벽데대한 Hit Test
	private void wallHitTest()
	{
		int x = ball.getX();
		int y = ball.getY();

		if( x <= 0 ) {
			ball.setPosX(0);
			ball.inverseDeltaX();
		}

		if( x+BALL_DIAMETER >= MAX_WIDTH) {
			ball.setPosX(MAX_WIDTH - BALL_DIAMETER);
			ball.inverseDeltaX();
		}

		if( y <= 0 ) {
			ball.setPosY(0);
			ball.inverseDeltaY();
		}

		if( y+BALL_DIAMETER >= MAX_HEIGHT ) {
			ball.setPosY(MAX_HEIGHT - BALL_DIAMETER);
			ball.inverseDeltaY();
		}
	}
};